/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tabladearistas;

import java.util.ArrayList;
import java.util.Iterator;
import processing.core.*;

/**
 *
 * @author DAVINCI
 */
public class TablaDeAristas extends PApplet {

    int nCoordenadas = 0;
    ArrayList lCoordenadas = new ArrayList();

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        PApplet.main(new String[]{"tabladearistas.TablaDeAristas"});
    }

    void CrearTA(ArrayList poligono) {
        Arista TA[] = new Arista[height];
        Coordenada a = (Coordenada)poligono.get(0);
        Coordenada b=new Coordenada(0,0);
        int dx, dy;
        float m;
        for(int i =1;i<=nCoordenadas;i++){
            if (i==nCoordenadas)b = (Coordenada) poligono.get(0);

            else b = (Coordenada) poligono.get(i);
            if (a.y < b.y) {
                dx = a.x - b.x;
                dy = b.y - a.y;
                if (dy != 0) {
                    m = (float) dx / (float) dy;
                    if (TA[a.y] == null) {
                        TA[a.y] = new Arista(b.y, a.x, (float) m);
                    } else {
                        Arista nueva = new Arista(b.y, a.x, (float) m);
                        Arista actual = TA[a.y];
                        Arista siguiente = TA[a.y].right;
                        while (siguiente != null) {
                            actual = siguiente;
                            siguiente = siguiente.right;
                        }
                        actual.right = nueva;
                    }
                }
            } else {
                dx = b.x - a.x;
                dy = a.y - b.y;
                 if (dy != 0) {
                     m = (float) dx / (float) dy;
                    if (TA[b.y] == null) {
                       TA[b.y] = new Arista(a.y, b.x, (float) m);
                    } else {
                        Arista nueva = new Arista(a.y, b.x, (float) m);
                        Arista actual = TA[b.y];
                        Arista siguiente = TA[b.y].right;
                        while (siguiente != null) {
                            actual = siguiente;
                            siguiente = siguiente.right;
                        }
                        actual.right = nueva;
                    }
                }
            }
            line(a.x,a.y,b.x,b.y);
            a = b;
        }
          line(a.x,a.y,b.x,b.y);

//        TA[2] = new Arista(7, 3, 1);
//        TA[2].right = new Arista(11, 2, 1);
//        TA[2].right.right = new Arista(13, 4, 1);
//        //ordenar cada lista
//        for (int j = 0; j <= height - 1; j++) {
//            if (TA[j] != null){
//            if (TA[j].xMin > TA[j].right.xMin) {
//                println(j);
//                Arista aux = TA[j];
//                aux.right = TA[j].right.right;
//                TA[j].right = TA[j];
//                TA[j] = aux;
//            }
//            }
//        }
        //


        println("LA TABLA ES:");
        for (int j = 0; j <= height - 1; j++) {
            if (TA[j] != null) {
                println("y" + j + ": yMax= " + TA[j].yMax + " xMin=" + TA[j].xMin + " xIncr=" + TA[j].xIncr + "\n");
                Arista actual = TA[j];
                Arista siguiente;
                if (TA[j].right != (null)) {
                    siguiente = TA[j].right;
                    while (siguiente != null) {
                        println("y" + j + ": yMax= " + siguiente.yMax + " xMin=" + siguiente.xMin + " xIncr=" + siguiente.xIncr + "\n");
                        actual = siguiente;
                        siguiente = siguiente.right;
                    }
                }
            }
        }
    }

    @Override
    public void setup() {
        size(800, 600);
        Coordenada nueva = new Coordenada(9, 8);
        nCoordenadas++;
        lCoordenadas.add(nueva);
        nueva = new Coordenada(7, 1);
        nCoordenadas++;
        lCoordenadas.add(nueva);
        nueva = new Coordenada(3, 4);
        nCoordenadas++;
        lCoordenadas.add(nueva);
        nueva = new Coordenada(1, 1);
        nCoordenadas++;
        lCoordenadas.add(nueva);
        nueva = new Coordenada(1, 9);
        nCoordenadas++;
        lCoordenadas.add(nueva);
        CrearTA(lCoordenadas);
        lCoordenadas.clear();
        nCoordenadas = 0;
    }

    @Override
    public void draw() {
    }

    @Override
    public void mousePressed() {
        nCoordenadas++;
        Coordenada nueva = new Coordenada(mouseX, mouseY);
        lCoordenadas.add(nueva);
        if (mouseButton == RIGHT) {
            CrearTA(lCoordenadas);
            lCoordenadas.clear();
            nCoordenadas = 0;
        }
//        print(mouseX+" "+mouseY);
    }

    static class Arista {

        Arista right;
        int yMax;
        int xMin;
        float xIncr;

        Arista(int newYMax, int newXMin, float newXIncr) {
            right = null;
            yMax = newYMax;
            xMin = newXMin;
            xIncr = newXIncr;
        }
    }

    static class Coordenada {

        int x;
        int y;

        Coordenada(int newX, int newY) {
            x = newX;
            y = newY;
        }
    }

    public static void insertSort(int[] v) {
        for (int i = 1; i < v.length; i++) {
            int aux = v[i];
            int j;
            for (j = i - 1; j >= 0 && v[j] > aux; j--) {
                v[j + 1] = v[j];

            }
            v[j + 1] = aux;
        }
    }
}
